@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@P!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `8  ɐ     `TU  } L ? .  t`GBJ ~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI4 0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D8:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D8:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu } 3E:}DISK OPERATING SYSTEM II VERSION COPYRIGHT 1984 ATARI CORP.A. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDG*}E J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRES+}SF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES P. FORMAT SINGLEL !N',}#"&))9(&*)/h)''-&؆莟R'S  vL/ˢ L }Insert DOS 2.0s, type Y Λx -}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!NO SUCH ITEMSELECT.} ITEM OR FOR MENU! 0 .z:*{}.|{ 1 0 0JB 18L%|DL/}%DIRECTORY--SEARCH SPEC,LIST FILE?[# 0 0 &|D3" 1L!NOT A DISK FILEN !B 1L!E# 1 !BD0}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.1}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1TYPE "Y" TO DELETE...DELETE FILE SPEC2}COPY--FROM, TO?OPTION NOT ALLOWED228 FREE SECTORS COPYING---D1:DISKFIX.COMl# 0|D .L/%#3}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY4}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E 5}1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!WILD CARDS NOT A6}LLOWED IN DESTINATION 0 <.|K}N 2 FORMAT. t* 5) 1L!`) 0NΞ 0 L1) 1 L!BAD LOAD FILELOAD FROM WHAT FILE?) 0 ?}0#B 1L!WHAT FILE TO LOCK?) 0 0$B 1L!WHAT FILE TO UNLOCK?DUP DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO US@}E PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV.FE! +L1   `*  70 2 2A} 0.* 1 y0 0)INSERT BOTH DISKS, TYPE RETURN^, 1 y038逍 N, 1L! ,B}C, t*  Lx+, 0 ^, 1 y0 , ,0,0 ,L+ ,I0 ,Vǭ0C}Ξ, 0 }, 1 y0C,ШC, 0K'!" H H 'h h Lx+!EF 5L1L!D,I,HhD}` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNINSERT DESTINATION DISK,TYPE RETURNE}`  `8 rL1`-* 1P* 1 y0Y`hhL!NAME OF FILE TO MOVE?- 0 0|DL% <.F},^ 1 70 0 .@L# .BJ 1  DEHIB V L1 ,} 1 70,L.  G}JB|,#P#DE 1 HI BDEHHII 1 B 1 ,^ 1 70,0La- B V,#PH},^ 1 70 0L#L!-* 1P* 1 y0Yj383}mm ݭI}}`8}``|* ? ɛ,`|:-)| / 1L!`DESTINATION CANT BE DOJ}S.SYS0 0H{ 24Δ 28/L!/) 2 Π 2 0 ξK}hAΞB,0 J 1 BDEHI,HÝDE 1HIHIDELSAVE-GIVE L}FILE,START,END(,INIT,RUN)O S0 1`BDEPHI V` S0H 1 L!M}0 0 1L~0`PLEASE TYPE 1 LETTER,0`hhL! 70 1L0L<1 ,;ɛ7,"ɛ:ݦ1ݥN}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{NAMEO} TOO LONG B VL!` L1I H1EΝDL1|mDiE` V0`8d/8 i:222 1 LP}!ERROR- 160ɛ+,' 20*.. өr2 1``2TOO MANY DIGITSINVALID HEXAQ}DECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uR} ECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8u Article 4783 of comp.sys.atari.8bit: From: terpin@acsu.buffalo.edu (christophe d terpin) Newsgroups: comp.sys.atariT}.8bit Subject: Homemade MIDI Interface -- Part 1 of 2 Summary: How to build midi interface for Atari 8bit Keywords: MIDU}I, interface Date: 28 Mar 91 02:51:18 GMT Sender: news@acsu.Buffalo.EDU Organization: SUNY Buffalo Homemade MIDV}I interface for the Atari 8-Bit ------------------------------------------- Parts List: 1 7404 TTL Hex Inverter OR 74W}00 NAND gate 2 220 ohm resistors (10%) 1 Atari serial port plug for your computer 2 5-pin Midi plugs (RCA) for yoX}ur midi keyboard 1 breadboard/experimenter perf board 1 project case approx. 10 ft. of 3 wire cable twist ties tY}o tie down wires etc.. The serial port pins as seen on the computer are: 2 4 6 8 10 12 Z} o o o o o o o o o o o o o 1 3 5 7 9 11 13 1 - Clock In 7 - [}Command 2 - Clock Out 8 - Motor Control 3 - Data In 9 - Proceed 4 - Ground 10 - +5V \} 5 - Data Out 11 - Audio In 6 - Ground 12 - +12V 13 - Interrupt For this project, we will only ]}need to use pin #'s 3,4,5, and 10 of the serial port. --------------- (CRUDE) ^} Ground (pin 4) SCHEMATIC: 7404 | |\ |\ _} 2| | \ | \ 220 ohm 5 o 4 data out ---| O--| O---\/\/\/---------o o---/\/\/\/-`}- +5 (pin 10) from computer | / | / 3 o o 1 (pin 5) |/ |/ MIDI OUTPUT cabla}e to synth 2 5 o 4 Ground---o o------------(optoisolator)------- data in to computerb} 3 o o 1 (pin 3) MIDI INPUT cable from synth Pins 1,3 of the c}Midi Output cable and pins 1,2,3 of the Midi Input cable are not connected. The optoisolator is optional, although it d}is recommended for extra protection for your midi keyboard. I have used the interface hard wired without the optoisolate}or without any problems (so far). Also note: the normal serial i/o to the disk will sometimes interfere with the midi f}interface and vice versa. This sometimes results in a note sounding on the synth when loading or saving a file, or the g}disk will glitch if you try playing the keyboard during disk i/o. One possible way to remedy this annoying problem is to reh}place the 7404 with a tri-state buffer which can be turned to a high-Z state using the motor control (pin 8) from the seri}ial port. Anyway, BE CAREFUL and check all your wiring before you hook the interface up to the synthesizer. Pj}lease let me know if you have any suggestions for improving the interface. next:: BASIC Midi Recorder Program k} New & Improved Assembly Source Code --------------------------------------------------------------- Christopher Terpil}n terpin@autarch.acsu.buffalo.edu r TerpivFG#5FILEACHOICDUBHBLIOCIOCBICCOICSTICBAICBAICBLICBLERRO n}  ATARI 8B o}IT MIDI RECORDER by Christopher Terpin 1991%%terpin@autarch.acsu.buffalo.edu(2<load in ml routinesF p}K;@ ,filenameP #BU;'6-@ $A@%@ $AV36-;$9900Z3A'AV q}!+3MOVE HIMEM DOWN[% +@%(@ LOADING...d"n As:-@@:(@ r}P:$A'A(,%x# %6-%@# AMAIN MENU,6-?:<@:I,,,INITIALIZE CIO HANDLER s}56-P:+I:,&A0,,5SIZE OF SONG BUFFERO ;,"67@,.>:AU,467,.>:AU,C67@,.O6- t}-@-@@K3 (}-@@3(ɠɠAR@. u}-@@.(by Chris Terpin 19916-@@6(Choose one of the following:,-@@,(() v}est midi output"-@@ "(()ecord -@@ (()lay -@@ (()ave -@ w}@ (()oad -@@ (()uit"+-@@ +( bytes recorded'+-@@!+(B:, x} byte buffer,)@6">:,4T A" A@">:,4R A " AJ">:,4P A0"  y}AT">:,4S A@" A^">:,4L AP" Ac">:,4O A`" Ah>:,4Q z}A`r AԠɠś@""@@VPLAY CHROMATIC SCALE {}ON CHANNEL 1-@6@$&(@>:,@&NOTE ON.-@@ 8'(@>:, |}'NOTE OFFB L$ ě 6-?:<@:R,AH**6-F:A,%AV$F:A,&C:,R +\$  }˛ R +@"(@playing=(@ Ԡ̭R(@Ϡ ''6-?:<@:P, 6 }-?:<@:C,,reset sio AA+@+@@(@7@<,@$ }((ERROR::F:A,!( hit a key)@!$ ěAR9 (}-@@5( }LOAD: Enter filename96-?:<@:C,,reset sio*6-P:C:,'AV,*6-C:,&AV$5 AQ6-@ }5@I6-$@6-A4%-6-A5%;6-A6%I6-A7%6-A@%6-AA }%?@'3?AU$6-?:C:hhhLV,<,$call cio" 6-F:,"6-F:, }%AV$F:,)A6(ERROR:))@P$p ԛz6-?:<@:C,,AR'!!104 },104,104,201,73,208,3,76'33,153,201,82,208,3,76,85$'!!154,201,80,208,3,76,116,154.' 201,67,208,3,76,183,153,568' }96,160,0,185,26,3,201,0B'""240,9,200,200,200,192,34,208L'242,56,96,169,86,153,26,3V'!!200,169,86,153,26,3,200,169`' }153,153,26,3,160,5,185,10j' 2,153,80,153,136,16,247,96t'0,0,0,0,0,0,100,153~'%%100,153,107,153,108,153,107,153' }""107,153,76,106,153,169,0,141'""182,153,160,1,96,133,203,173'182,153,201,8,240,8,169,8'$$141,182,153,32,142,153, }165,203'##141,13,210,165,58,240,252,169'0,133,58,160,1,96,169,115' 141,50,2,141,15,210,165,16'41,207,24,9,48 },133,16,141'!!14,210,169,22,141,4,210,169'0,141,6,210,169,40,141,8'210,169,0,133,58,96,0,169'3,141,50,2,141 },15,210,165(!!16,41,192,133,16,141,14,210 ( 169,0,133,204,133,58,160,5( 185,80,153,153,10,2,136,16(""247,96,152, }72,173,15,210,141((!!10,210,165,204,240,42,160,02(""173,115,154,201,2,144,15,160<(!!1,145,205,169,255,160,0,145F(""20 }5,140,115,154,160,2,173,13P($$210,145,205,200,152,24,101,205Z(##133,205,165,206,105,0,133,206d(##169,255,133,57,104,168 },104,64n($$165,204,240,37,238,115,154,201x(""255,208,30,160,0,169,255,145(##205,160,1,169,255,145,205,169(""0,141,1 }15,154,24,165,205,105(!!2,133,205,165,206,105,0,133(!!206,169,24,141,40,2,169,154(141,41,2,160,1,162,0,169( 2, }32,92,228,96,104,133,206(##104,133,205,169,0,141,115,154(""133,57,32,65,154,169,218,141(10,2,169,153,141,11,2,32 }(""142,153,96,0,104,133,208,104(%%133,207,104,141,245,154,104,141(##244,154,169,0,141,246,154,169(!!248,141,12,2,16 }9,154,141,13)2,169,3,141,14,2,169,155)141,15,2,32,142,153,160,0)""177,207,201,255,208,35,160,1")!!177,207,168, }169,16,141,46,2,)162,0,169,5,32,92,228,1736)46,2,208,251,169,2,32,215@)##154,173,252,2,201,146,208,214J) 96,32,1 }09,153,169,1,32,215T)##154,173,246,154,240,200,96,24^)##101,207,133,207,165,208,105,0h)$$133,208,205,245,154,144,12,165 }r)!!207,205,244,154,144,5,169,1|)141,246,154,96,0,0,0,0)165,16,9,8,133,16,141,14)##210,104,64,169,255,133,58,16 }5)!!16,41,247,133,16,141,14,210)104,64,-1 D:MIDI.BAS65,16,9,8,133,16,141,14)##210,104,64,169,255,133,58,16 D10 .TITLE "Atari Midi Interface"20 .PAGE "C Terpin 1991"30 ; created: 06/89 revised:03/9140 ;50 ; Midi 'V:' Handler60} ;70 ; Christopher Terpin80 ; 144 Eggert Road90 ; Buffalo, N.Y. 142150100 ; terpin@autarch.acsu.buffalo.edu0110 ; or} terpin@ubunix.acsu.buffalo.edu0120 ;0130 ; THIS SOURCE CODE IS IN THE0140 ; PUBLIC DOMAIN.0150 ; Please feel free to mod}ify and0160 ; improve this code. Please0170 ; let me know about any major0180 ; improvements or bugs you0190 ; have disc}overed. Enjoy!0200 ;0210 ;0220 ;0230 ; execution from AtariBASIC:0240 ;1. POKE 106,154:GR.0:DOS0250 ;2. load D:MIDI.OBJ}0255 ;3. run BASIC cartridge0260 ;4. I=USR(39168,cmd,[start, end],speed) (see below)0270 ;------------------------------0}280 ; to initialize V: handler:0290 ; I=USR(39168,ASC("I"))0300 ; CLOSE #1:OPEN #1,8,0,"V:"0310 ; use ?#1; or PUT #1 to se}nd midi codes (i.e. ?#1;"A@";)0320 ;------------------------------0330 ;0340 ; to reset normal serial i/o:0350 ; I=USR(3}9168,ASC("C"))0360 ;-------------------------------0370 ; to record:0380 ; I=USR(39168,ASC("R"),ADR(A$))0390 ; POKE 204,1} to start recording0400 ; POKE 204,0 to stop recording0410 ; L = PEEK(205)+256*PEEK(206)0420 ; is # of bytes recorded04}30 ;------------------------------0440 ; to playback:0450 ; I=USR(39168,ASC("P"),ADR(A$),ADR(A$)+L)0460 ;-----------------}-------------0470 ; to record B while playing A:0480 ; I=USR(39168,ASC("R"),ADR(B$))0490 ; POKE 204,1 :I=USR(39168,ASC("P"}),ADR(A$),ADR(A$)+L):POKE 204,00500 ;------------------------------0510 ;0520 ; equates0530 ;0540 AUDCTL=$D208 ; pokey }register0550 OUTBUF=$CB ; character for output0560 SWITCH= $CC ; 0==stop recording0570 BUFADD = $CD ; pointer to buffe}r for recording0580 PLAYBUF = $CF ; pointer to buffer for playback0590 CH = $2FC ; last key pressed0600 RECVDN = $39 ; }receive flag0610 SERIN = $D20D ; serial i/o0620 SEROUT = SERIN0630 ;0640 VSERIN=$020A ; interrupt vector for serial inpu}t0650 VSEROR = $20C ; interrupt vector for serial output ready0660 VSEROC = $20E ; interrupt vector for serial output compl}ete0670 ;0680 AUDF3=$D204 ; pokey ch3 :baudlo0690 AUDF4=$D206 ; pokey ch4 :baudhi0700 XMTDON=$3A ; transmit done flag07}10 SSKCTL=$232 ; serial port control shadow0720 SKCTL=$D20F ; serial port control (W)0730 SKSTAT=$D20F ; serial port status} (R)0740 SKRES= $D20A ; resets SKSTAT0750 POKMSK=$10 ; shadow of IRQEN0760 IRQEN=$D20E ; interrupt request0770 HATABS=$3}1A ; pointer to handler table0780 MIDIL= 22 ; midi baud rate0790 MIDIH = 0 ; values0800 RD = 4 ; CIO: open for re}ad0810 WR = 8 ; CIO: open for write0820 CPUT = 11 ; CIO: PUT command0830 COPEN = 3 ; CIO: OPEN command0840 CCLOS}E = 12 ; CIO: CLOSE command0850 ;0860 ; input-output control block (iocb)0870 ; structure:0880 ;0890 ICCOM = $342 ; comm}and0900 ICAX1 = $34A ; aux10910 ICAX2 = $34B ; aux20920 ICBAH = $345 ; buffer address hi0930 ICBAL = $344 ; buffer addres}s lo0940 ICBLL = $348 ; buffer length lo0950 ICBLH = $349 ; buffer length hi0960 CIOV = $E456 ; Central I/O vector0970 ;}0980 ;0990 ; countdown timers1000 ;1010 CDTMA1 = $0226 ; timer1 vector1020 CDTMA2 = $0228 ; timer2 vector1030 CDTMF5 = $}022E ; timer5 flag1040 SETVBV = $E45C ; set vblank1050 CONSOL = $D01F ; used for keyboard click1060 ;1070 MARK = 255 ; bu}ffer timing mark1080 CTRLC = 146 ; control-c key1090 ;1100 *= $99001110 ;1120 ;1130 START1140 PLA1150 PLA1160 PL}A get command1170 ;1180 CMP #'I1190 BNE OPT21200 JMP SETHAND ; setup CIO handler1210 ;1220 OPT2 CMP #'R12}30 BNE OPT31240 JMP RECORD ; midi record1250 ;1260 OPT3 CMP #'P1270 BNE OPT41280 JMP PLAYBACK ; midi playback1290} ;1300 OPT4 CMP #'C1310 BNE NOOPT1320 JMP RESET ; reset ser port1330 NOOPT SEC ; error1340 RTS1350 ;-----------}------------------1360 ; MIDI "V:" handler1370 ;1380 SETHAND1390 LDY #0 ; add our handler1400 LPHND LDA HATABS,Y141}0 CMP #0 ;free entry?1420 BEQ FOUND ;yes..1430 INY ;no, skip 3 bytes1440 INY1450 INY1460 CPY #34 ; }end of table?1470 BNE LPHND ; no...keep looking1480 SEC ; yes..full table!1490 RTS ; quit with error150}0 ;1510 FOUND LDA #'V ; "V:" handler1520 STA HATABS,Y ; save in table1530 INY1540 LDA #VTABL&255 ; store address155}0 STA HATABS,Y ; of vector1560 INY ; table in1570 LDA #VTABL/255 ; handler table1580 STA HATABS,Y1590 ;}1600 ; save interrupt vectors1610 ;1620 LDY #51630 SAVESER LDA VSERIN,Y1640 STA SAVEVEC,Y1650 DEY1660 BPL SAVESER1}670 ;1680 RTS1690 ;1700 SAVEVEC .BYTE 0,0,0,0,0,01710 ;1720 ;--------------------------1730 ; begin MIDI Handler1740 };1750 ; vector table:1760 VTABL .WORD VOPEN-11770 .WORD VCLOSE-11780 .WORD NOFUNC-1 (get)1790 .WORD VP}UT-11800 .WORD NOFUNC-1 (status)1810 .WORD NOFUNC-1 (special)1820 JMP VINIT ; initialization1830 ;----------}-------------------1840 VCLOSE1850 VOPEN LDA #01860 STA MODE1870 VINIT1880 RETURN1 LDY #1 ; return success1890 NOFUNC }RTS1900 ;-----------------------------1910 ;1920 ;1930 ;1940 ;----------------------------1950 ; PUT function1960 ;19}70 VPUT STA OUTBUF ; save accumulator1980 LDA MODE ; write mode ?1990 CMP #WR2000 BEQ WRMODE ; yes...2010 LDA #WR }; no..set flag2020 STA MODE ; and2030 JSR SETIO ; set up for serial output2040 ;2050 WRMODE LDA OUTBUF ; retrieve byt}e2060 STA SEROUT ; send it out &2070 WAIT LDA XMTDON wait for irqs2080 BEQ WAIT to do their2090 LDA #0 } stuff...2100 STA XMTDON reset flag2110 LDY #1 exit2120 RTS with success2130 ;---------}-------------------2140 ;2150 ;2160 ;----------------------------2180 ; enable serial I/O2190 SETIO LDA #$73 ; ALLOW I &} O concurrently!2200 CONT STA SSKCTL ; set the serial port control,2210 STA SKCTL and shadow2220 LDA POKMSK ; }get irqen mask2230 AND #$CF ; no keyboard interrupts2240 CLC2250 ORA #$30 ;allow both types2260 STA POKMSK } of serial interrupts2270 STA IRQEN2280 LDA #MIDIL2290 STA AUDF3 ;set 31.5k baud2300 LDA #MIDIH rate for i/o2}310 STA AUDF4 in POKEY2320 LDA #$28 ; clock ch3 with 1.79MHz2330 STA AUDCTL ; & link ch3 to ch42340 ;2350 L}DA #0 ; reset transmit2360 STA XMTDON done flag2370 RTS2380 ;2390 ;2400 MODE .BYTE 0 ; read/write mode flag2}410 ;2420 ;------------------------------2430 ; reset serial port2440 RESET2450 LDA #$032460 STA SSKCTL ; disable247}0 STA SKCTL serial port2480 LDA POKMSK interrupts2490 AND #$C02500 STA POKMSK2510 STA IRQEN2520 LDA #02530} STA SWITCH2540 STA XMTDON2550 LDY #5 ; restore vectors2560 RESTV LDA SAVEVEC,Y2570 STA VSERIN,Y2580 DEY2590 }BPL RESTV2600 RTS2610 ;----------------------------2620 ;2630 ;2640 ; interrupt service routine2650 ; for serial input} ready2660 ;2670 ;----------------------------2680 ISRSIR TYA2690 PHA save y register2700 LDA SKSTAT reset }latches2710 STA SKRES in case of overrun2720 LDA SWITCH check software switch2730 BEQ LEAVIT switch on?2740 LD}Y #0 ; yes,save interval2750 LDA INTERVAL2755 CMP #2 ; 2 jiffies?2760 BCC TOOSHORT ;time is too short2770 L}DY #12780 STA (BUFADD),Y2790 LDA #MARK2800 LDY #02810 STA (BUFADD),Y2820 STY INTERVAL ; reset counter2830 LDY #2}2840 TOOSHORT LDA SERIN ;load serial input2850 STA (BUFADD),Y store input2860 INY in buffer &2870 TYA288}0 CLC2890 ADC BUFADD2900 STA BUFADD increment the2910 LDA BUFADD+1 buffer pointer2920 ADC #02930 STA BUFAD}D+12940 ;2950 LEAVIT LDA #$FF set recvdn flag2960 STA RECVDN2970 PLA restore the2980 TAY y register2990 PLA} and the accumulator3000 RTI & return from interrupt.3010 ;-----------------------------3020 ;3030 ;3040 ;-------}----------------------3050 ; TIMER ROUTINE3060 ;3070 ; inserts timing marks3080 ; to count time interval3090 ;3100 ;---}-------------------------3110 TIMER3120 LDA SWITCH ;are we recording?3130 BEQ SETTIM ;NO...reset this vbi3150 IN}C INTERVAL ; count # of marks3160 CMP #255 ; max count?3170 BNE SETTIM ; no, continue3190 LDY #0 ; writ}e to buffer3200 LDA #MARK ; timing mark3210 STA (BUFADD),Y3220 LDY #13230 LDA #2553240 STA (BUFADD),Y3260 LDA} #0 ; reset counter3270 STA INTERVAL3280 ;3290 CLC ;increment the3300 LDA BUFADD ; buffer point}er3310 ADC #2 ; by two3320 STA BUFADD3330 LDA BUFADD+13340 ADC #03350 STA BUFADD+13360 ;3370 ;3380 SETTI}M3390 LDA #TIMER&255 ; reset the3400 STA CDTMA2 timer vector3410 LDA #TIMER/2563420 STA CDTMA2+13490 LDY #1 } ; speed lo (1 jiffy)3500 LDX #0 ; speed hi3510 LDA #2 ; use timer 23520 JSR SETVBV ; start it!3530 RTS} ; done..3540 ;------------------------------3550 ;3560 ;3570 ;3580 ;-----------------------------3590 ; REC}ORD routine3600 ;3610 ;3620 RECORD3630 PLA3640 STA BUFADD+1 ;address of3650 PLA recording buffer3660 S}TA BUFADD3710 LDA #03720 STA INTERVAL ; reset counter3730 STA RECVDN ; reset input flag3740 JSR SETTIM ; sta}rt timer3750 LDA #ISRSIR&2553760 STA VSERIN ;setup serial3770 LDA #ISRSIR/256 input interrupts3780 STA VSERIN+1}3790 JSR SETIO ;enable serial input3800 RTS ; done!3820 INTERVAL .BYTE 03830 ;-----------------------------}3840 ;3850 ;3860 ; PLAYBACK routine3870 ;3880 PLAYBACK3890 PLA3900 STA PLAYBUF+1 ; playback buffer3910 PLA3920 }STA PLAYBUF3930 PLA3940 STA ENDBUF+1 ; pointer to end of buffer3950 PLA3970 STA ENDBUF4020 ;4030 LDA #04040 STA} DONE ; reset flag4050 ;4060 LDA #ISEROR&255 ; set up4070 STA VSEROR serial output4080 LDA #ISEROR/256 r}eady4090 STA VSEROR+1 interrupt4100 ;4110 LDA #ISRTD&255 ; set up4120 STA VSEROC serial output4130 LDA }#ISRTD/256 complete4140 STA VSEROC+1 interrupt4150 JSR SETIO4160 ;4170 ;4180 ;4190 ;4200 ;------------------}------------4210 ; output buffer4220 PLAYLOOP4230 LDY #04240 LDA (PLAYBUF),Y ; get note4250 CMP #MARK ; is it a ma}rk?4260 BNE ISMIDI ; no...4270 LDY #1 ; yes...wait4280 LDA (PLAYBUF),Y4290 TAY ; Y=jiffys to wait4300 } LDA #$104310 STA CDTMF54320 LDX #04330 LDA #54340 JSR SETVBV ; start timer 54350 WAITLOOP LDA CDTMF5 ; dumdedum..}4360 BNE WAITLOOP4370 ;4380 LDA #24390 JSR INCPLAY ; inc buffer by 24400 LDA CH ; check for break4410 CMP #C}TRLC4420 BNE PLAYLOOP4430 RTS4440 ;4450 ISMIDI JSR VPUT ; otherwise send it4460 LDA #14470 JSR INCPLAY ; incr. }by 14480 LDA DONE ; finished?4490 BEQ PLAYLOOP ; no....4500 RTS ; yes..quit4510 ;4520 ;4530 ;4540 INCP}LAY4550 CLC ; increment4560 ADC PLAYBUF playbuf by A4570 STA PLAYBUF4580 LDA PLAYBUF+14590 ADC #0460}0 STA PLAYBUF+14610 ;4620 CMP ENDBUF+1 ; end of song?4630 BCC NOTEND4640 LDA PLAYBUF4650 CMP ENDBUF4660 BCC NOT}END ; no..4670 LDA #1 ; yes...4680 STA DONE set done flag4690 NOTEND RTS4700 ;4710 ;4720 ENDBUF .}BYTE 0,04730 DONE .BYTE 0,04740 ;4750 ;4760 ;4770 ;4780 ;-----------------------------4790 ; serial output ready4800 }; interrupt service routine4810 ;4820 ISEROR4830 ;4840 LDA POKMSK ; enable4850 ORA #$08 the transmit done4860 ST}A POKMSK interrupt4870 STA IRQEN4880 PLA ; pop accumulator4890 RTI4900 ;4910 ;---------------------------49}20 ; Transmit Done Interrupt4930 ;4940 ISRTD4950 LDA #$FF ;set transmit4960 STA XMTDON done flag4970 LDA POK}MSK4980 AND #$F7 ;disable tdi4990 STA POKMSK5000 STA IRQEN5010 PLA ;restore accum.5020 RTI5030 ;---}-------------------------isable tdi4990 STA POKMSK5000 STA IRQEN5010 PLA ;restore accum.5020 RTI5030 ;---?B%DOS SYSB*)DUP SYSBSMIDIHW TXTB,mMIDI BASBaMIDI ASM